package org.example.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * Redis 配置
 * 配置自定义 RedisTemplate
 * 修改 Redis 序列化方式，默认 JdkSerializationRedisSerializer
 *
 * @author LY
 */
@Configuration
public class RedisConfig {

    /**
     * 自定义 RedisTemplate
     * <p>
     * 该方法旨在创建并配置一个RedisTemplate实例，用于与Redis数据库进行交互
     * RedisTemplate是Spring Data Redis提供的一个类，简化了Redis操作，本方法通过注入RedisConnectionFactory来初始化RedisTemplate
     * 同时，调用configureSerializers方法来配置键和值的序列化方式，确保数据在存储和获取时的一致性和高效性
     *
     * @param redisConnectionFactory Redis连接工厂，用于创建和管理Redis的连接
     * @return 配置好的RedisTemplate实例，用于执行各种Redis操作
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 配置序列化器
        configureSerializers(template);

        return template;
    }

    /**
     * 配置RedisTemplate的序列化方式
     *
     * @param template RedisTemplate实例，用于设置不同的序列化方式
     */
    private void configureSerializers(RedisTemplate<String, Object> template) {
        // 创建字符串序列化器
        RedisSerializer<String> stringSerializer = RedisSerializer.string();
        // 创建JSON序列化器
        RedisSerializer<Object> jsonSerializer = RedisSerializer.json();
        // 设置键的序列化方式为字符串序列化
        template.setKeySerializer(stringSerializer);
        // 设置值的序列化方式为JSON序列化
        template.setValueSerializer(jsonSerializer);
        // 设置哈希表键的序列化方式为字符串序列化
        template.setHashKeySerializer(stringSerializer);
        // 设置哈希表值的序列化方式为JSON序列化
        template.setHashValueSerializer(jsonSerializer);
    }
}